package cn.cosmosx.base.util;

import cn.cosmosx.base.exception.PlatformException;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 查询VO结果集转换工具类
 *
 * @author gengzhy
 */
public final class TransferVoUtils {

    /**
     * 分页查询结果集VO转换
     *
     * @param srcPage       - 原分页对象
     * @param resultVoClazz - 转换VO Class
     * @param <T>           - 原对象类型
     * @param <R>           - 转换后对象类型
     * @return - page
     */
    public static <T, R> IPage<R> transferPage(IPage<T> srcPage, Class<R> resultVoClazz) {
        // 转换结果
        IPage<R> resultPage = new Page<>();
        BeanUtil.copyProperties(resultPage, srcPage);
        List<R> newRecords = srcPage.getRecords().stream().map(item -> {
            R resultVo;
            try {
                resultVo = BeanUtil.copyProperties(resultVoClazz.newInstance(), item);
            } catch (Exception e) {
                throw new PlatformException("PageVO结果转换异常");
            }
            return resultVo;
        }).collect(Collectors.toList());
        resultPage.setRecords(newRecords);
        return resultPage;
    }

    /**
     * VO结果集转换
     *
     * @param src           - 原对象
     * @param resultVoClazz - 目标对象Class
     * @param <T>           - 原对象类型
     * @param <R>           - 目标对象类型
     * @return
     */
    public static <T, R> R transferVO(T src, Class<R> resultVoClazz) {
        if (src == null) {
            return null;
        }
        try {
            return BeanUtil.copyProperties(resultVoClazz.newInstance(), src);
        } catch (Exception e) {
            throw new PlatformException("PageVO结果转换异常");
        }
    }

    /**
     * VO结果集转换
     *
     * @param srcs           - 原对象集合
     * @param resultVoClazz - 目标对象Class
     * @param <T>           - 原对象类型
     * @param <R>           - 目标对象类型
     * @return
     */
    public static <T, R> List<R> transferVOs(Collection<T> srcs, Class<R> resultVoClazz) {
        if (srcs == null) {
            return null;
        }
        List<R> rs = new ArrayList<>();
        srcs.forEach(s -> rs.add(transferVO(s, resultVoClazz)));
        return rs;
    }
}
